import pygetwindow as gw
import win32gui
import win32con
import time
import logging
import sys
import os
import shutil

# --- 配置 ---
# 配置日志记录到文件，因为没有控制台窗口
# 将日志文件放在脚本同目录下
script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) # 获取exe所在目录
log_file_path = os.path.join(script_dir, "hide_idm_window.log")

# 配置日志，写入文件并设置级别
logging.basicConfig(
    filename=log_file_path,
    level=logging.INFO, # 可改为 logging.DEBUG 查看更详细信息
    format='%(asctime)s - %(levelname)s - %(message)s',
    filemode='a' # 追加模式
)
logger = logging.getLogger(__name__)

# 要监控和隐藏的窗口标题
TARGET_WINDOW_TITLE = "IDM is corrupt"

# 获取当前用户的启动文件夹路径
startup_folder = os.path.join(os.environ.get('APPDATA'), r"Microsoft\Windows\Start Menu\Programs\Startup")
# --- 配置结束 ---


def add_to_startup():
    """
    将当前运行的exe添加到Windows启动文件夹，实现开机自启。
    """
    try:
        # 获取当前运行的exe的完整路径
        exe_path = os.path.abspath(sys.argv[0])
        if not exe_path.lower().endswith('.exe'):
            logger.warning("脚本似乎未打包成exe，无法添加到开机启动项。")
            return

        # 确定快捷方式或exe文件在启动文件夹中的名称
        exe_name = os.path.basename(exe_path)
        startup_file_path = os.path.join(startup_folder, exe_name)

        # 检查是否已经存在于启动文件夹
        if os.path.exists(startup_file_path):
            logger.info(f"程序已存在于启动项中: {startup_file_path}")
            return

        # 将exe文件复制到启动文件夹
        shutil.copy2(exe_path, startup_file_path)
        logger.info(f"程序已成功添加到开机启动项: {startup_file_path}")

    except Exception as e:
        logger.error(f"添加到开机启动项时出错: {e}")

def hide_window(window_title):
    """
    查找并隐藏指定标题的窗口。
    :param window_title: 目标窗口的标题
    """
    try:
        # 使用 pygetwindow 查找窗口
        windows = gw.getWindowsWithTitle(window_title)
        if windows:
            for window in windows:
                hwnd = window._hWnd  # 获取窗口句柄
                logger.info(f"找到窗口 '{window_title}' (句柄: {hwnd})")
                
                # 检查窗口当前是否可见
                if win32gui.IsWindowVisible(hwnd):
                    # 使用 ShowWindow 隐藏 (推荐，更直接)
                    win32gui.ShowWindow(hwnd, win32con.SW_HIDE)
                    logger.info(f"已隐藏窗口 '{window_title}' (句柄: {hwnd})")
                else:
                    logger.debug(f"窗口 '{window_title}' (句柄: {hwnd}) 已经是隐藏状态")
        else:
            # 如果没有找到窗口，记录调试信息
            logger.debug(f"未找到窗口 '{window_title}'")
    except Exception as e:
        logger.error(f"处理窗口 '{window_title}' 时出错: {e}")

def main():
    """
    主循环函数，持续扫描并隐藏目标窗口。
    """
    logger.info("程序启动...")
    
    # 在主循环开始前，尝试添加到开机启动项
    add_to_startup()
    
    logger.info(f"目标窗口标题: '{TARGET_WINDOW_TITLE}'")
    logger.info("开始后台扫描窗口... (程序已设置为开机自启)")

    try:
        while True:
            hide_window(TARGET_WINDOW_TITLE)
            # 每隔一段时间扫描一次，避免CPU占用过高
            time.sleep(1) 
    except Exception as e:
        logger.critical(f"主循环发生未处理的异常: {e}")
    finally:
        logger.info("程序退出。")

if __name__ == "__main__":
    main()
